你有想過 Line、KKBOX 等 App 上面的「與外部帳號連結」是怎麼做到的嗎
▲ Line
▲ KKBOX
其實都是用到類似今天這篇要分享的方法-與其他帳號連結 (Link To Other Account)
首先先到 Firebase Auth 官方開發文件
點擊「Link Multiple Auth Providers to an Account on iOS」
在文件中可以看到,如果要將其他身份驗證提供者與單一帳號做連結的話
會需要用到 Credential (憑證) 這個東西,那這個東西要怎麼生出來呢,其實很簡單
因為先前在分享 Google 帳號、Facebook 帳號、Apple ID 登入的時候就已經有產生了
【在 iOS 開發路上的大小事-Day18】透過 Firebase 來管理使用者 (Sign in with Google 篇) Part2
【在 iOS 開發路上的大小事-Day20】透過 Firebase 來管理使用者 (Sign in with Facebook 篇) Part2
【在 iOS 開發路上的大小事-Day22】透過 Firebase 來管理使用者 (Sign in with Apple 篇) Part2
// Sign in with Google
let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
// Sign in with Facebook
let credential = FacebookAuthProvider.credential(withAccessToken: accessToken.tokenString)
// Sign in with Apple
let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce)
接下來就來透過 Credential 來將多種 OAuth 身份驗證提供者通通連結在一起
下面就以 Sign in with Google 來做示範,其他的登入方式做法都是大同小異的~
先前分享的 Sign in with Google 與 Firebase Auth 連接的部分如下
func firebaseSignInWithGoogle(credential: AuthCredential) {
Auth.auth().signIn(with: credential) { authResult, error in
guard error == nil else {
CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
return
}
CustomFunc.customAlert(title: "登入成功!", message: "", vc: self, actionHandler: self.getFirebaseUserInfo)
}
}
我們要將它改成下面這樣,透過 Credential 來與其他 OAuth 身份驗證方式連結在一起
func firebaseSignInWithGoogle(credential: AuthCredential) {
if let user = Auth.auth().currentUser {
user.link(with: credential) { authResult, error in
if let error = error {
CustomFunc.customAlert(title: "", message: "\(String(describing: error.localizedDescription))", vc: self, actionHandler: nil)
return
}
CustomFunc.customAlert(title: "", message: "與其他登入方式的帳號連結成功!", vc: self, actionHandler: nil)
}
} else {
Auth.auth().signIn(with: credential) { authResult, error in
guard error == nil else {
CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
return
}
CustomFunc.customAlert(title: "登入成功!", message: "", vc: self, actionHandler: self.getFirebaseUserInfo)
}
}
}
假設有一天突然改變心意,像是變心的人一樣
不想再與其進行連結的話,可以透過下面的方法來解除 (切八段)
let providerID = Auth.auth().currentUser?.providerID
Auth.auth().currentUser?.unlink(fromProvider: providerID!) { user, error in
if let error = error {
CustomFunc.customAlert(title: "", message: "\(String(describing: error.localizedDescription))", vc: self, actionHandler: nil)
return
}
CustomFunc.customAlert(title: "", message: "已取消與其他登入方式的帳號連結!", vc: self, actionHandler: nil)
}
以上就是透過 Firebase Auth 來與多個 OAuth 身份驗證提供者進行連結和解除連結的方法~
參考資料: